//! 字符串比较函数
//! 
//! 从C版本转换的字符串比较工具模块

/// 比较两个字符串是否相等
///
/// # 参数
/// * `string1` - 第一个字符串引用
/// * `string2` - 第二个字符串引用
///
/// # 返回值
/// * `true` - 两个字符串相等
/// * `false` - 两个字符串不相等
pub fn string_equal(string1: &str, string2: &str) -> bool {
    string1 == string2
}

/// 比较两个字符串的顺序
///
/// # 参数
/// * `string1` - 第一个字符串引用 
/// * `string2` - 第二个字符串引用
///
/// # 返回值
/// * `-1` - 第一个字符串小于第二个
/// * `0` - 两个字符串相等
/// * `1` - 第一个字符串大于第二个
pub fn string_compare(string1: &str, string2: &str) -> i32 {
    match string1.cmp(string2) {
        std::cmp::Ordering::Less => -1,
        std::cmp::Ordering::Equal => 0, 
        std::cmp::Ordering::Greater => 1
    }
}

/// 忽略大小写比较两个字符串是否相等
///
/// # 参数
/// * `string1` - 第一个字符串引用
/// * `string2` - 第二个字符串引用
/// 
/// # 返回值
/// * `true` - 忽略大小写后两个字符串相等
/// * `false` - 忽略大小写后两个字符串不相等
pub fn string_nocase_equal(string1: &str, string2: &str) -> bool {
    string1.to_lowercase() == string2.to_lowercase()
}

/// 忽略大小写比较两个字符串的顺序
///
/// # 参数
/// * `string1` - 第一个字符串引用
/// * `string2` - 第二个字符串引用
///
/// # 返回值
/// * `-1` - 第一个字符串小于第二个
/// * `0` - 两个字符串相等  
/// * `1` - 第一个字符串大于第二个
pub fn string_nocase_compare(string1: &str, string2: &str) -> i32 {
    match string1.to_lowercase().cmp(&string2.to_lowercase()) {
        std::cmp::Ordering::Less => -1,
        std::cmp::Ordering::Equal => 0,
        std::cmp::Ordering::Greater => 1
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_string_equal() {
        assert!(string_equal("hello", "hello"));
        assert!(!string_equal("hello", "world"));
    }

    #[test]
    fn test_string_compare() {
        assert_eq!(string_compare("a", "b"), -1);
        assert_eq!(string_compare("b", "a"), 1);
        assert_eq!(string_compare("a", "a"), 0);
    }

    #[test]
    fn test_string_nocase_equal() {
        assert!(string_nocase_equal("Hello", "hello")); 
        assert!(!string_nocase_equal("hello", "world"));
    }

    #[test]
    fn test_string_nocase_compare() {
        assert_eq!(string_nocase_compare("A", "b"), -1);
        assert_eq!(string_nocase_compare("B", "a"), 1);
        assert_eq!(string_nocase_compare("a", "A"), 0);
    }
}

